package com.smart.community.property.dto;

import com.smart.community.commons.base.BaseDTO;
import lombok.Data;
import lombok.EqualsAndHashCode;

import javax.validation.constraints.*;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;

/**
 * 维修工单数据传输对象
 * @author Wu.Liang
 * @since 2025-06-26
 * @version 1.0.0
 */
@Data
@EqualsAndHashCode(callSuper = true)
public class RepairOrderDTO extends BaseDTO {
    private static final long serialVersionUID = -4430126389763581410L;

	/**
     * 工单编号
     */
    @Size(max = 50, message = "工单编号长度不能超过50个字符")
    private String orderNo;
    
    /**
     * 社区ID
     */
    // 移动端提交流程：如果提供，则直接使用，如果不提供，则当提供 householdId 时，后端可根据 householdId 推导 communityId
    // 因此此处不强制 NotNull 校验，统一在 Service 里做兜底
    private Long communityId;
    
    /**
     * 用户ID
     */
    @NotNull(message = "用户ID不能为空")
    private Long userId;
    
    /**
     * 房户ID - 可选，公共设施维修时可为空
     */
    private Long householdId;
    
    /**
     * 维修标题
     */
    @NotBlank(message = "维修标题不能为空")
    @Size(max = 100, message = "维修标题长度不能超过100个字符")
    private String title;
    
    /**
     * 维修描述
     */
    @NotBlank(message = "维修描述不能为空")
    @Size(max = 500, message = "维修描述长度不能超过500个字符")
    private String description;
    
    /**
     * 维修地址
     */
    // 详细地址改为可编辑，前端会默认填充 fullAddress，这里不强制非空
    @Size(max = 200, message = "维修地址长度不能超过200个字符")
    private String repairAddress;
    
    /**
     * 维修类型：1-水电维修，2-门窗维修，3-电梯维修，4-消防维修，5-其他
     */
    @NotNull(message = "维修类型不能为空")
    @Min(value = 1, message = "维修类型值无效")
    @Max(value = 5, message = "维修类型值无效")
    private Integer repairType;
    
    /**
     * 紧急程度：1-一般，2-紧急，3-非常紧急
     */
    @NotNull(message = "紧急程度不能为空")
    @Min(value = 1, message = "紧急程度值无效")
    @Max(value = 3, message = "紧急程度值无效")
    private Integer urgencyLevel;
    
    /**
     * 工单状态：1-待处理，2-处理中，3-已完成，4-已取消
     */
    private Integer status = 1;
    
    /**
     * 联系人姓名
     */
    // 移动端简化流程，本期不强制采集联系人姓名
    @Size(max = 50, message = "联系人姓名长度不能超过50个字符")
    private String contactName;
    
    /**
     * 联系人电话
     */
    @Pattern(regexp = "^1[3-9]\\d{9}$", message = "联系人电话格式不正确")
    private String contactPhone;
    
    /**
     * 期望完成时间
     */
    private LocalDateTime expectedCompletionTime;
    
    /**
     * 受理时间
     */
    private LocalDateTime acceptTime;
    
    /**
     * 开始维修时间
     */
    private LocalDateTime startTime;
    
    /**
     * 完成时间
     */
    private LocalDateTime completeTime;
    
    /**
     * 分配人员ID
     */
    private Long assignTo;
    
    /**
     * 维修费用预估
     */
    @DecimalMin(value = "0.00", message = "维修费用预估不能为负数")
    @Digits(integer = 10, fraction = 2, message = "维修费用预估格式不正确")
    private BigDecimal estimatedCost;
    
    /**
     * 维修费用
     */
    @DecimalMin(value = "0.00", message = "维修费用不能为负数")
    @Digits(integer = 10, fraction = 2, message = "维修费用格式不正确")
    private BigDecimal repairCost;
    
    /**
     * 维修结果
     */
    @Size(max = 500, message = "维修结果长度不能超过500个字符")
    private String repairResult;
    
    /**
     * 满意度评分：1-5分
     */
    @Min(value = 1, message = "满意度评分不能小于1")
    @Max(value = 5, message = "满意度评分不能大于5")
    private Integer satisfactionScore;
    
    /**
     * 评价内容
     */
    @Size(max = 500, message = "评价内容长度不能超过500个字符")
    private String evaluationContent;
    
    /**
     * 备注
     */
    @Size(max = 500, message = "备注长度不能超过500个字符")
    private String remark;
    
    /**
     * 图片附件列表 - 移动端图片上传
     */
    private List<String> imageList;
    
    /**
     * 查询条件：关键词
     */
    @Size(max = 100, message = "关键词长度不能超过100个字符")
    private String keyword;
    
    /**
     * 查询条件：开始日期
     */
    private LocalDateTime startDate;
    
    /**
     * 查询条件：结束日期
     */
    private LocalDateTime endDate;
    
    /**
     * 验证提交信息
     * @return 验证结果
     */
    public boolean validateSubmit() {
        return userId != null
            && (communityId != null || householdId != null)
            && repairType != null && title != null && !title.trim().isEmpty()
            && urgencyLevel != null
            && description != null && !description.trim().isEmpty()
            ;
    }
    
    /**
     * 判断是否已完成
     * @return 是否已完成
     */
    public boolean isCompleted() {
        return status != null && status == 3;
    }
    
    /**
     * 判断是否已取消
     * @return 是否已取消
     */
    public boolean isCancelled() {
        return status != null && status == 4;
    }
    
    /**
     * 判断是否为紧急工单
     * @return 是否为紧急工单
     */
    public boolean isUrgent() {
        return urgencyLevel != null && urgencyLevel >= 2;
    }
    
    /**
     * 获取维修类型名称
     * @return 维修类型名称
     */
    public String getRepairTypeName() {
        if (repairType == null) {
            return "未知";
        }
        
        switch (repairType) {
            case 1:
                return "水电维修";
            case 2:
                return "门窗维修";
            case 3:
                return "电梯维修";
            case 4:
                return "消防维修";
            case 5:
                return "其他";
            default:
                return "未知";
        }
    }
    
    /**
     * 获取紧急程度名称
     * @return 紧急程度名称
     */
    public String getUrgencyLevelName() {
        if (urgencyLevel == null) {
            return "未知";
        }
        
        switch (urgencyLevel) {
            case 1:
                return "一般";
            case 2:
                return "紧急";
            case 3:
                return "非常紧急";
            default:
                return "未知";
        }
    }
} 